<script setup>
import { reactive, ref, onMounted, onUnmounted, getCurrentInstance } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import path from "path-browserify";

// 1. 基础实例与路由
const { proxy: { $http } } = getCurrentInstance()
const route = useRoute()
const router = useRouter()
// 2. WebSocket相关状态
const ws = ref(null) // WebSocket实例
const isWsConnected = ref(false) // WebSocket连接状态
const reconnectTimer = ref(null) // 重连定时器（避免断连后无法重新接收消息）
const WS_TOPIC = '/topic/school/teacher' // 需订阅的后端主题（与后端一致）
const WS_URL = ref('') // WebSocket连接地址（动态拼接协议和域名）
// 新增：心跳超时计时器（检测后端是否按时发心跳）
const heartbeatTimeoutTimer = ref(null)
// 新增：心跳配置（与后端完全对齐）
const HEARTBEAT_CONFIG = {
  TIMEOUT: 55 * 1000, // 前端超时检测（比后端60秒短，避免误判）
  RESPONSE_MSG: JSON.stringify({ type: "HEARTBEAT_RESPONSE" }), // 心跳响应格式
  REQUEST_TYPE: "HEARTBEAT_REQUEST" // 后端心跳请求标识
};

// 3. 页面加载时初始化WebSocket
onMounted(async () => {
    WS_URL.value = path.join(import.meta.env.BASE_URL, import.meta.env.DEV ? "wss://service.neucityai.com:30080/xjwxx/xjwxx-websocket" : "wss://http://192.168.1.19:8031/xjwxx/xjwxx-websocket")  // 后端WebSocket地址（与NativeWebSocketConfig一致）
    initWebSocket() // 建立WebSocket连接
})

// 4. 页面卸载时销毁WebSocket（避免内存泄漏）
onUnmounted(() => {
    sendUnsubscribeMessage()
    if (ws.value) {
        ws.value.close(1000, '页面关闭主动断开连接') // 1000代表正常关闭
        ws.value = null
    }
  // 新增：页面卸载时清除心跳超时计时器
  if (heartbeatTimeoutTimer.value) {
    clearTimeout(heartbeatTimeoutTimer.value);
  }
    if (reconnectTimer.value) {
        clearTimeout(reconnectTimer.value) // 清除重连定时器
    }
})
// 收到后端任何消息时调用，重置超时计时器
const resetHeartbeatTimeout = () => {
  if (heartbeatTimeoutTimer.value) {
    clearTimeout(heartbeatTimeoutTimer.value);
  }
  // 超时后判定连接异常，触发重连
  heartbeatTimeoutTimer.value = setTimeout(() => {
    console.error('WebSocket心跳超时，触发重连');
    if (ws.value) {
      ws.value.close(999, '心跳超时'); // 1001：端点离开（超时场景）
    }
    triggerReconnect();
  }, HEARTBEAT_CONFIG.TIMEOUT);
};

// 5. 初始化WebSocket连接（核心：建立连接+订阅主题+监听消息）
const initWebSocket = () => {
    // 避免重复创建连接
    if (ws.value && isWsConnected.value) return

    try {
        // 创建WebSocket实例
        ws.value = new WebSocket(WS_URL.value)

        // 5.1 连接成功回调
        ws.value.onopen = () => {
            isWsConnected.value = true
            console.log('WebSocket连接成功，已开始监听教学指令')
            // 连接成功后，发送「订阅主题」请求（后端需此步骤关联会话与主题）
            sendSubscribeMessage()
          // 新增：连接成功后启动心跳超时检测
          resetHeartbeatTimeout();
        }

        // 5.2 接收后端WebSocket消息（核心逻辑：按规则跳转页面）
        ws.value.onmessage = (event) => {
            try {
                // 解析后端推送的消息（后端返回的是AjaxResult格式）
                const messageData = JSON.parse(event.data)
                resetHeartbeatTimeout()
              // 新增：判断是否为后端心跳请求，是则回复响应（不干扰业务逻辑）
              if (messageData.type === HEARTBEAT_CONFIG.REQUEST_TYPE) {
                console.log('收到后端心跳请求，回复响应');
                ws.value.send(HEARTBEAT_CONFIG.RESPONSE_MSG);
                return;
              }
                console.log('收到WebSocket消息：', messageData)

                // 校验消息结构：最外层data.type === "cmd" + 内层data.type === "control"
                const outerData = messageData.data // 对应后端AjaxResult.success(resultData)中的resultData
                if (outerData?.type === 'cmd' && outerData?.data?.type === 'control') {
                    console.log('收到控制类WebSocket消息：', outerData.data.content)

                    if (outerData.data.content === '0') {
                        router.push({ path: "studentIndex" })
                    } else if (outerData.data.content === '1') {
                        router.push({ path: "studentOne" })
                    } else if (outerData.data.content === '2') {
                        router.push({ path: "studentTwo" })
                    } else if (outerData.data.content === '3') {
                        router.push({ path: "studentThree" })
                    } else if (outerData.data.content === '4') {
                        router.push({ path: "studentFour" })
                    }
                } else {
                    // 非目标格式的消息（如其他业务消息），不处理但打印日志
                    console.log('非控制类WebSocket消息，跳过处理：', messageData)
                }
            } catch (err) {
                console.error('消息解析错误：', err)
            }
        }

        // 5.3 连接错误回调
        ws.value.onerror = (error) => {
            isWsConnected.value = false
            console.error('WebSocket错误：', error)
          // 新增：错误时清除心跳计时器
          if (heartbeatTimeoutTimer.value) clearTimeout(heartbeatTimeoutTimer.value);
            // 触发重连机制
            triggerReconnect()
        }

        // 5.4 连接关闭回调（异常关闭时自动重连）
        ws.value.onclose = (event) => {
            isWsConnected.value = false
          // 新增：关闭时清除心跳计时器
          if (heartbeatTimeoutTimer.value) clearTimeout(heartbeatTimeoutTimer.value);
            // 排除「页面关闭主动断开」的情况（避免不必要的重连提示）
            if (event.code !== 1000) {
                console.error(`WebSocket连接已关闭（状态码：${event.code}），正在尝试重连...`)
                triggerReconnect() // 触发重连
            }
        }
    } catch (err) {
        console.error('WebSocket初始化错误：', err)
    }
}

// 6. 发送「订阅主题」消息给后端（后端需此消息关联会话与主题）
const sendSubscribeMessage = () => {
    if (!ws.value || !isWsConnected.value) return

    // 构造订阅消息（需与后端CustomWebSocketHandler的handleTextMessage解析规则一致）
    const subscribeMsg = {
        command: 'SUBSCRIBE', // 后端识别的订阅命令（后端代码中判断"SUBSCRIBE"）
        destination: WS_TOPIC // 要订阅的主题（与后端TOPIC_SCHOOL_TEACHER一致）
    }

    try {
        ws.value.send(JSON.stringify(subscribeMsg))
        console.log('已发送订阅请求：', subscribeMsg)
    } catch (err) {
        ElMessage.error('发送订阅请求失败')
        console.error('订阅消息发送错误：', err)
    }
}
// 7. 新增：发送取消订阅消息（配合后端优化的主题分组清理）
const sendUnsubscribeMessage = () => {
  if (!ws.value || !isWsConnected.value) return

  const unsubscribeMsg = {
    command: 'UNSUBSCRIBE', // 后端新增支持的取消命令
    destination: WS_TOPIC
  }

  try {
    ws.value.send(JSON.stringify(unsubscribeMsg))
    console.log('已发送取消订阅请求：', unsubscribeMsg)
  } catch (err) {
    console.error('取消订阅消息发送错误：', err)
  }
}
// 7. WebSocket断连后重连机制（避免断连后无法接收消息）
const triggerReconnect = () => {
    // 清除之前的重连定时器（避免重复重连）
    if (reconnectTimer.value) {
        clearTimeout(reconnectTimer.value)
    }
    // 3秒后重新初始化连接（避免频繁重连给后端造成压力）
    reconnectTimer.value = setTimeout(() => {
        console.log('正在重新建立WebSocket连接...')
        initWebSocket()
    }, 3000)
}

// 8. 「开始教学」按钮点击事件（保留原接口调用逻辑）
const startTeaching = async () => {
}
</script>

<template>

</template>

<style scoped lang='scss'>

</style>
